# 必选参数：必须得传，不能缺失
def add(x, y):
    return x + y


# 默认参数：不传的时候就用设置的默认值来做参数值。默认参数不能放在必选参数前面。
def add_with_default_param(x, y=10):
    return x + y


# 可变参数：
# 将实参所有的位置参数接受，放入在一个元组中。传人的参数的数量是可以改变的，也可以不传入。
def func_with_args(*args):
    print(args, type(args))


# 可部分解出参数，剩下的仍然放入元组中
def func_with_args2(a, *args):
    print(a, args, type(args))


# 关键字参数：接受所有的关键字参数，然后将其转换成一个字典赋值给kwargs这个形参。
def func_with_kwargs(**kwargs):
    print(kwargs, type(kwargs))


# 当返回多值时，用逗号隔开，返回值的类型为元组
def test():
    def func():
        print('hhh')

    return '返回值1', 2, (1, 2, 3), [4, 5], {6, 7}, func


# 无返回值时，返回的是None
def test2():
    print('这是test2,没有返回值')
    # return


print(type(add))
print(add(1, 2))

print(add_with_default_param(5))
print(add_with_default_param(5, 5))

func_with_args()
func_with_args(1)
func_with_args(1, [1])
func_with_args2('1', 2, [3], {4})
func_with_args2(*('1', 2, [3], {4}))

func_with_kwargs()
func_with_kwargs(a='hhh', b='666')

print(test())
func = test()[-1]
func()

print(test2())
